package cn.lyjuan.first.netty._4_netty_serialize.msg.reader.impl;

import cn.lyjuan.base.util.HexUtils;
import cn.lyjuan.first.netty._4_netty_serialize.cst.MessageConst;
import cn.lyjuan.first.netty._4_netty_serialize.msg.reader.IReader;
import com.sun.jmx.remote.internal.ArrayQueue;
import io.netty.buffer.ByteBuf;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.List;
import java.util.Queue;

public abstract class AbstractReader implements IReader
{
    /**
     * 一直读取到尾部
     *
     * @param buf
     * @return 返回空表示数据不完整，需要等待
     */
    protected String readToFoot(ByteBuf buf)
    {
        int readerIndex = buf.readerIndex();
        boolean hasFoot = false;
        byte[] b = new byte[1];// 一次仅读取一个字节
        int i = 0;
        String data = null;
        StringBuilder sb = new StringBuilder();
        // 读取到结尾
        while (buf.isReadable())
        {
            buf.readBytes(b);
            sb.append(HexUtils.toHex(b));

            if ((sb.length() >> 1) > MessageConst.LEN_FOOT)
                sb.delete(0, 2);// 一个十六进制字节是两个字母

            if (sb.indexOf(MessageConst.FOOT) > -1)
            {
                hasFoot = true;

                // 去除尾部数据
                int len = buf.readerIndex() - readerIndex - MessageConst.LEN_FOOT;

                // 恢复位置
                buf.readerIndex(readerIndex);

                // 重新读取完整数据
                b = new byte[len];
                buf.readBytes(b);

                data = new String(b, MessageConst.CHARSET);

                break;
            }

            i++;
        }

        if (hasFoot)
            return data;

        // 没有读取到尾部
        buf.readerIndex(readerIndex);
        return null;
    }
}
